package top.lshaci.learning.activiti.day1;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import java.util.List;

import static top.lshaci.learning.activiti.util.ProcessEngineSingleton.singleton;

/**
 * ProcessInstanceTest
 * 流程执行管理
 *
 * @author liangxu
 */
public class ProcessInstanceTest {
    /**
     * 1、启动流程
     * <pre>
     * 启动后，会在2张运行时相关表产生数据
     *  act_ru_execution : 1条（执行表，流程执行到每一个活动时，都会创建一个execution）
     *      6.0.0会存在2条
     *  act_ru_task      : 1条（任务表，用来描述“人工任务”）
     * </pre>
     * <pre>
     *     Execution：执行对象，描述执行到的每一个活动节点信息
     *     ProcessInstance：流程实例，描述整个流程的信息（继承自Execution对象，是一个特殊的Execution）
     *
     *     ProcessInstance有4大特点：
     *     1、一个流程对应一个流程实例
     *     2、流程实例的ID在整个流程过程中不会改变
     *     3、流程实例永远指向当前活动的节点
     *     4、特殊的Execution。流程实例用于是作为根部的执行对象
     *      单线流程中：
     *          “执行对象”就是“流程实例”
     *      并发流程中：
     *          会在分支处，创建一个“执行对象”作为流程实例，
     *          然后把分支下，多个活动对应的Execution对象，
     *          挂在分支处的执行对象下，作为子执行对象
     * </pre>
     */
    @Test
    public void startProcess() {
        RuntimeService runtimeService = singleton.runtimeService();
        // 根据流程定义KEY（画流程图时定义的ID），启动具体一个流程
        String processDefinitionKey = "LeaveFlow2";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
        System.err.println(processInstance);
    }

    /**
     * 2、查看任务：私有任务
     */
    @Test
    public void queryPersonalTask() {
        List<Task> taskList = singleton.taskService()
                .createTaskQuery()
                .taskAssignee("李四")
                .list();
        taskList.forEach(System.err::println);
    }

    /**
     * 2、查看任务：公共任务
     */
    @Test
    public void queryCommonTask() {
        List<Task> taskList = singleton.taskService()
                .createTaskQuery()
                .taskCandidateUser("正经理")
                .list();
        taskList.forEach(System.err::println);
    }

    /**
     * 3、认领任务（公共任务）
     */
    @Test
    public void claimTask() {
        singleton.taskService().claim("20002", "正经理");
    }

    /**
     * 4、办理任务
     */
    @Test
    public void completeTask() {
        singleton.taskService().complete("20002");
    }

    /**
     * 5、查看流程状态
     */
    @Test
    public void viewProcessStatus() {
        String processInstanceId = "17501";
        ProcessInstance processInstance = singleton.runtimeService()
                .createProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult();
        System.err.println(processInstance.getActivityId());
    }
}
